package com.douding.server.service;

import com.douding.server.domain.File;
import com.douding.server.domain.FileExample;
import com.douding.server.dto.FileDto;
import com.douding.server.dto.PageDto;
import com.douding.server.mapper.FileMapper;
import com.douding.server.util.CopyUtil;
import com.douding.server.util.UuidUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;


import java.util.Date;
import java.util.UUID;

@Service
public class FileService {

    @Resource
    private FileMapper fileMapper;


    /**
     * 列表查询
     */
    public void list(PageDto pageDto) {
        PageHelper.startPage(pageDto.getPage(), pageDto.getSize());
        FileExample fileExample = new FileExample();
        List<File> fileList = fileMapper.selectByExample(fileExample);
        PageInfo<File> pageInfo = new PageInfo<>(fileList);
        pageDto.setTotal(pageInfo.getTotal());
        List<FileDto> fileDtoList = CopyUtil.copyList(fileList, FileDto.class);
        pageDto.setList(fileDtoList);
    }

    public void save(FileDto fileDto) {

        File file = CopyUtil.copy(fileDto, File.class);
        //根据key值去数据库查询File
        File fileDb = selectByKey(fileDto.getKey());
        //判断是新增 还是修改
        if (fileDb == null) {
            this.insert(file);
        } else {
            //如果是更新的话 先更改文件的ShardIndex属性 在update
            fileDb.setShardIndex(fileDto.getShardIndex());
            this.update(fileDb);
        }

    }

    //新增数据
    private void insert(File file) {

        Date now = new Date();
        file.setCreatedAt(now);
        file.setUpdatedAt(now);

        file.setId(UuidUtil.getShortUuid());
        fileMapper.insert(file);
    }

    //更新数据
    private void update(File file) {
        file.setUpdatedAt(new Date());
        fileMapper.updateByPrimaryKey(file);
    }

    public void delete(String id) {

        fileMapper.deleteByPrimaryKey(id);
    }

    //根据前端生成的MD5标识查询文件
    public File selectByKey(String key) {
        FileExample example = new FileExample();
        example.createCriteria().andKeyEqualTo(key);
        List<File> fileList = fileMapper.selectByExample(example);
        if (CollectionUtils.isEmpty(fileList)) {
            return null;
        } else {
            return fileList.get(0);
        }
    }

    /**
     * 根据文件标识查询数据库记录
     */
    public FileDto findByKey(String key) {
        return CopyUtil.copy(selectByKey(key), FileDto.class);
    }

//    /**
//     * 保存文件块(此方法可提取为一个工具类中的工具方法)
//     *
//     * @param source : 文件块
//     * @param size   : 文件块大小
//     * @return java.lang.String
//     * @author kevin
//     * @date 2021/1/7
//     */
//    private String saveFile(MultipartFile source, Long size, String path) throws IOException {
//        String now = LocalDateTime.now().format(DateTimeFormatter.ofPattern(SystemConst.DATE_ONLY_FORMATTER));
//        if (null == source || source.isEmpty()) {
//            Log.info("未获取到需要保存的分片文件！");
//        }
//        if (source.getSize() != size) {
//            Log.info("分片文件大小与传入的分片大小不一致！");
//        }
//        path = path + File.separator + now;
//        File file = new File(path);
//        if (!file.exists() && !file.mkdirs()) {
//            throw new CommonException("创建文件夹失败");
//        }
//        //根据文件名获取文件类型
//        String fileType = (null == fileName || !fileName.contains(".")) ? "unknown" :
//                fileName.substring(fileName.lastIndexOf("."));
//        //保存文件块到磁盘
//        while (true) {
//            String saveFileName = UUID.randomUUID() + fileType.toLowerCase() + ".tmp";
//            File saveFilePath = new File(path, saveFileName);
//            //磁盘上块文件名如果已经存在，则重新生成文件名
//            if (saveFilePath.exists()) {
//                continue;
//            }
//            source.transferTo(saveFilePath);
//            return saveFilePath.getAbsolutePath();
//        }
//    }
}
//end class
